#ifndef TVECTOR3_H
#define TVECTOR3_H

#include "Config/Export.h"
#include <cmath>

namespace blue {

template <typename type>
class SHARED TVector3
{
    public:

        TVector3();
        TVector3(type x, type y, type z);
        TVector3(const TVector3<type> & v);
        TVector3(const TVector3 & from, const TVector3<type> &to);

        TVector3<type> &operator= (const TVector3<type> &v);

        TVector3<type> &operator+= (const TVector3<type> &v);
        TVector3 operator+ (const TVector3<type> &v) const;

        TVector3<type> &operator-= (const TVector3<type> &v);
        TVector3<type> operator- (const TVector3<type> &v) const;

        TVector3<type> &operator*= (const type a);
        TVector3<type> operator* (const type a) const;

        TVector3<type> &operator/= (const type a);
        TVector3<type> operator/ (const type a) const;

        TVector3<type> crossProduct(const TVector3<type> &v) const;
        type length()const;
        TVector3<type> &normalize();

        type X, Y, Z;

};

#include "Maths/TVector3.inl"

typedef TVector3<int> Vector3i;
typedef TVector3<float> Vector3f;
typedef TVector3<long> Vector3l;
typedef TVector3<double> Vector3d;

}
#endif
